"""
【输入切换】
策略模式(Strategy Pattern)

策略模式定义了一系列算法，并将每个算法封装起来，再一个对外使用的类使得它们可以相互替换。
如定义一个抽象类，基于它实现多种算法实体类，可替换使用的方法同名，然后一个不继承的统一对外类，且类中有方法可以切换使用算法类，且也有方法能调用到同名函数
"""
from abc import ABC, abstractmethod


class SortingStrategy(ABC):
    @abstractmethod
    def sort(self, data):
        pass


class MergeSort(SortingStrategy):
    def sort(self, data):
        print("Sorting data using merge sort...")


class QuickSort(SortingStrategy):
    def sort(self, data):
        print("Sorting data using quick sort...")


class BubbleSort(SortingStrategy):
    def sort(self, data):
        print("Sorting data using bubble sort...")


class Sorter:
    def __init__(self, sorting_strategy):
        self.sorting_strategy = sorting_strategy

    def set_sorting_strategy(self, sorting_strategy):
        self.sorting_strategy = sorting_strategy

    def sort_data(self, data):
        self.sorting_strategy.sort(data)


data = [5, 2, 4, 1, 3]
merge_sort = MergeSort()
quick_sort = QuickSort()
bubble_sort = BubbleSort()

sorter = Sorter(merge_sort)
sorter.sort_data(data)

sorter.set_sorting_strategy(quick_sort)
sorter.sort_data(data)

sorter.set_sorting_strategy(bubble_sort)
sorter.sort_data(data)
"""
Sorting data using merge sort...
Sorting data using quick sort...
Sorting data using bubble sort...
"""
